#ifndef _binding_h_
#define _binding_h_

#include <string>
#include <iostream>
#include <map>
#include "SDL.h"
#include "sdl_layer.h"
#include "sdl_input.h"

/**
 * \brief Opis stanu klawisza
 *
 * Inicjalizacja i operator = z symbolu klawisza według SDL. Można rzutować na bool, co zwraca stan klawisza.
 * \code
 * 	sdl_bindstate state=SDLK_UP;
 * 	state.state=true;
 * \endcode
 * Tylko do użytku wewnętrznego :)
 */

struct sdl_bindstate {
    ///symbol klawisza według SDL
    int key;
    ///wciśnięty lub nie
    bool state;

    sdl_bindstate();
    sdl_bindstate(const int & k);
    sdl_bindstate(const SDLKey & k);
    sdl_bindstate(const std::string & k);
    sdl_bindstate(const char * k);
    ///operator = przypisuje do klawisza
    void operator=(const int & k);
    ///przypisanie za pomocą nazwy klawisza
    void operator=(const std::string & k);
    void operator=(const char * k);
    operator bool();
};

/**
 * \brief menadżer przypisań klawiszy do "zdarzeń"
 * \todo uogólnienie na wszystkie urządzenia wprowadzające
 *
 * Klasa mapuje opis stringowy zdarzenia do klawisza SDL. Nie musimy używać kodów SDLK_*, wystarczy używanie nazw takich jak "up", "a" itd. Przykład:
 * \code
 * 	sdl_binding binding;
 *
 *	// ustawiamy przypisanie
 * 	binding["move character up"]="up";	// "move character up" to akcja, "up" to klawisz
 *
 *
 * \endcode
 * Później w kodzie:
 * \code
 * 	if(binding["move character up"]){
 *			// wykonanie odpowiedniej akcji, jeżeli wciśnięty będzie klawisz związany z "move character up"
 *		}
 * \endcode
 *
 */

class sdl_binding : public sdl_layer {
    ///mapa zdarzeń na stany klawiszy
    std::map<std::string, sdl_bindstate> kmap;

public:
    sdl_binding();
    ///wyrzuca kod SDL klawisza o nazwie n
    static int get_key_from_name(const std::string & n);
    bool operator()(const std::string & name);
    virtual void update();
    sdl_bindstate & operator[](const std::string & name);
};







#endif //_binding_h_

